package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import dominio.Cliente;
import dominio.Pedido;
import dominio.PersistentObject;

public class PedidoDAO extends DataAccessObject {

	@Override
	public void delete(PersistentObject obj) throws PersistentException {
		Connection conn = null;
		PreparedStatement pst = null;
		try {
			Pedido pedido = (Pedido) obj;
			conn = getConnection();
			String sql = "DELETE FROM Pedido WHERE id = ?";
			pst = conn.prepareStatement(sql);
			pst.setInt(1, pedido.getId());
			int registro = pst.executeUpdate();
			if(registro == 0)
				throw new ObjectNotFoundException("No se encontro el cliente a eliminar");
			commitTransaction();			
		}
		catch(SQLException sqex) {
			rollBackTransaction();
			throw new PersistentException(sqex.getMessage());
		}
		finally {
			try {
				conn.close();
				if(pst != null) pst.close();
			}
			catch(SQLException sqex) {}
		}
	}

	@Override
	public void insert(PersistentObject obj) throws PersistentException {
		Connection conn = null;
		PreparedStatement pst = null;
		try {
			Pedido pedido = (Pedido) obj;

			conn = getConnection();
			String sql = "INSERT INTO Pedido (id,fechaEntrega,fechaFinalizado,estado,idCliente) VALUES(?,?,?,?,?)";
			pst = conn.prepareStatement(sql);
			pst.setInt(1, pedido.getId());
			pst.setDate(2, new java.sql.Date(pedido.getFechaEntrega().getTime()));
			if(pedido.getFechaFinalizado()==null){
				pst.setDate(3, null);
			}else{
				pst.setTimestamp(3, new java.sql.Timestamp(pedido.getFechaFinalizado().getTime()));	
			}
			pst.setString(4, pedido.getEstado());
			pst.setInt(5, pedido.getCliente().getId());
			int registro = pst.executeUpdate();
			if(registro == 0)
				throw new ObjectNotFoundException("No se pudo insertar el Pedido");
			commitTransaction();		
			ProductoPedidoDAO ppDAO=new ProductoPedidoDAO();
			conn.close();
			if(pst != null) pst.close();
			ppDAO.delete(pedido);
			ppDAO.insert(pedido);
		}
		catch(SQLException sqex) {
			rollBackTransaction();
			throw new PersistentException(sqex.getMessage());
		}
	}

	@Override
	public List<Object> selectAll() throws PersistentException {
		Connection conn = null;
		Statement pst = null;
		ResultSet rs = null;
		try {
			conn = getConnection();
			conn.setAutoCommit(true);
			String sql = "SELECT * FROM Pedido";
//			String sql="SELECT Producto.*, Pedido.*, Cliente.*, ProductoPedido.* FROM Cliente INNER JOIN " +
//					"(Producto INNER JOIN (Pedido INNER JOIN ProductoPedido ON Pedido.Id = " +
//					"ProductoPedido.IdPedido) ON Producto.Id = ProductoPedido.IdProducto) ON Cliente.Id " +
//					"= Pedido.IdCliente";
			pst = conn.createStatement();
			
			rs = pst.executeQuery(sql);
			
			List<Object> pedidos = new ArrayList<Object>();
			Pedido pedido = null;
			while(rs.next()) {
				pedido= new Pedido();
				pedido.setId(rs.getInt("Id"));
				pedido.setCliente(ClienteDAO.buscarPorId(rs.getInt("IdCliente")));
				pedido.setEstado(rs.getString("Estado"));
				pedido.setFechaEntrega(new java.util.Date(rs.getDate("FechaEntrega").getTime()));
				java.sql.Timestamp fin=rs.getTimestamp("FechaFinalizado");
				if(fin==null){
					pedido.setFechaFinalizado(null);
				}else{
				pedido.setFechaFinalizado(new java.util.Date(fin.getTime()));
				}
				pedido.setProductosPedido(ProductoPedidoDAO.getProductos(pedido.getId()));
				pedidos.add(pedido);
			}
			
			return pedidos;
		}
		catch(SQLException sqex) {
			throw new PersistentException(sqex.getMessage());
		}
		finally {
			try {
				conn.close();
				if(pst != null) pst.close();
				if(rs != null) rs.close();
			}
			catch(SQLException sqex) {}
		}
	}

	@Override
	public void update(PersistentObject obj) throws PersistentException {
		Connection conn = null;
		PreparedStatement pst = null;
		try {
			Pedido pedido = (Pedido) obj;
			conn = getConnection();
			String sql = "UPDATE Pedido SET Estado=?,FechaEntrega=?,FechaFinalizado=? WHERE Id=?";
			pst = conn.prepareStatement(sql);
			pst.setInt(4, pedido.getId());
			pst.setString(1, pedido.getEstado());
			pst.setTimestamp(2, new java.sql.Timestamp(pedido.getFechaEntrega().getTime()));
			if(pedido.getFechaFinalizado()==null){
				pst.setDate(3, null);
			}else{
			pst.setTimestamp(3, new java.sql.Timestamp(pedido.getFechaFinalizado().getTime()));
			}
			int registro = pst.executeUpdate();
			if(registro == 0)
				throw new PersistentException("No se pudo actualizar el pedido");
			commitTransaction();			
		}
		catch(SQLException sqex) {
			rollBackTransaction();
			throw new PersistentException(sqex.getMessage());
		}
		finally {
			try {
				conn.close();
				if(pst != null) pst.close();
			}
			catch(SQLException sqex) {}
		}
	}

	public static List<Pedido> buscarPorIdCliente(Cliente unCliente)throws PersistentException {
		Connection conn = null;
		Statement pst = null;
		ResultSet rs = null;
		try {
			conn = getConnection();
			conn.setAutoCommit(true);
			String sql = "SELECT * FROM Pedido WHERE IdCliente ="+unCliente.getId();
			pst = conn.createStatement();
			rs = pst.executeQuery(sql);
			List<Pedido> pedidos = new ArrayList<Pedido>();
			Pedido pedido = null;
			while(rs.next()) {
				pedido= new Pedido();
				pedido.setId(rs.getInt("Id"));
				pedido.setCliente(unCliente);
				pedido.setEstado(rs.getString("Estado"));
				pedido.setFechaEntrega(new java.util.Date(rs.getDate("FechaEntrega").getTime()));
				java.sql.Timestamp fin=rs.getTimestamp("FechaFinalizado");
				if(fin==null){
					pedido.setFechaFinalizado(null);
				}else{
				pedido.setFechaFinalizado(new java.util.Date(fin.getTime()));
				}
				pedido.setProductosPedido(ProductoPedidoDAO.getProductos(pedido.getId()));
				pedidos.add(pedido);
			}
			return pedidos;
		}
		catch(SQLException sqex) {
			throw new PersistentException(sqex.getMessage());
		}
		finally {
			try {
				conn.close();
				if(pst != null) pst.close();
				if(rs != null) rs.close();
			}
			catch(SQLException sqex) {}
		}
	}

	public static Pedido buscarPorIdPedido(int idPedido)throws PersistentException {
		Connection conn = null;
		Statement pst = null;
		ResultSet rs = null;
		try {
			conn = getConnection();
			conn.setAutoCommit(true);
			String sql = "SELECT * FROM Pedido WHERE Id ="+idPedido;
			pst = conn.createStatement();
			rs = pst.executeQuery(sql);
			Pedido pedido = null;
			while(rs.next()) {
				pedido= new Pedido();
				pedido.setId(rs.getInt("Id"));
				pedido.setCliente(ClienteDAO.buscarPorId(rs.getInt("IdCliente")));
				pedido.setEstado(rs.getString("Estado"));
				pedido.setFechaEntrega(new java.util.Date(rs.getDate("FechaEntrega").getTime()));
				if(rs.getDate("FechaFinalizado")==null){
					pedido.setFechaFinalizado(null);
				}else{
				pedido.setFechaFinalizado(new java.util.Date(rs.getDate("FechaFinalizado").getTime()));
				}
				pedido.setProductosPedido(ProductoPedidoDAO.getProductos(idPedido));
				
			}
			return pedido;
		}
		catch(SQLException sqex) {
			throw new PersistentException(sqex.getMessage());
		}
		finally {
			try {
				conn.close();
				if(pst != null) pst.close();
				if(rs != null) rs.close();
			}
			catch(SQLException sqex) {}
		}
	}



	public static boolean productoEnPedido(int idProducto) throws PersistentException {
		Connection conn = null;
		Statement pst = null;
		ResultSet rs = null;
		boolean retorno=false;
		try {
			conn = getConnection();
			conn.setAutoCommit(true);
			String sql = "SELECT IdPedido FROM ProductoPedido WHERE IdProducto ="+idProducto;
			pst = conn.createStatement();
			rs = pst.executeQuery(sql);
			while(rs.next()) {
				retorno=true;
			}
			return retorno;
		}		catch(SQLException sqex) {
			throw new PersistentException(sqex.getMessage());
		}
		finally {
			try {
				conn.close();
				if(pst != null) pst.close();
			} catch (SQLException e) {
				throw new PersistentException(e.getMessage());
			}
		}
	}

	public static List<Pedido> buscarPorEstado(String estado) throws PersistentException {
		Connection conn = null;
		Statement pst = null;
		ResultSet rs = null;
		try {
			conn = getConnection();
			conn.setAutoCommit(true);
			String sql = "SELECT * FROM Pedido WHERE Estado ='"+estado+"'";
			pst = conn.createStatement();
			rs = pst.executeQuery(sql);
			List<Pedido> pedidos = new ArrayList<Pedido>();
			Pedido pedido = null;
			while(rs.next()) {
				pedido= new Pedido();
				pedido.setId(rs.getInt("Id"));
				pedido.setCliente(ClienteDAO.buscarPorIdPedido(pedido.getId()));//ver loop
				pedido.setEstado(rs.getString("Estado"));
				pedido.setFechaEntrega(new java.util.Date(rs.getDate("FechaEntrega").getTime()));
				java.sql.Timestamp fin=rs.getTimestamp("FechaFinalizado");
				if(fin==null){
					pedido.setFechaFinalizado(null);
				}else{
				pedido.setFechaFinalizado(new java.util.Date(fin.getTime()));
				}
				pedido.setProductosPedido(ProductoPedidoDAO.getProductos(pedido.getId()));
				pedidos.add(pedido);
			}
			return pedidos;
		}
		catch(SQLException sqex) {
			throw new PersistentException(sqex.getMessage());
		}
		finally {
			try {
				conn.close();
				if(pst != null) pst.close();
				if(rs != null) rs.close();
			}
			catch(SQLException sqex) {}
		}
	}

	public static List<Pedido> buscarPorFecha(Date fechaIni, Date fechaFin) throws PersistentException {
		Connection conn = null;
		Statement pst = null;
		ResultSet rs = null;
		java.sql.Date SQLDate1=new java.sql.Date(fechaIni.getTime());
		java.sql.Date SQLDate2=new java.sql.Date(fechaFin.getTime());
		String finalizado="Finalizado";
		try {
			conn = getConnection();
			conn.setAutoCommit(true);
			String sql = "SELECT * FROM Pedido WHERE Estado ='"+finalizado+"'" +
					"and FechaFinalizado BETWEEN #"+SQLDate1+"# AND #"+SQLDate2+"#";
			pst = conn.createStatement();
			rs = pst.executeQuery(sql);
			List<Pedido> pedidos = new ArrayList<Pedido>();
			Pedido pedido = null;
			while(rs.next()) {
				pedido= new Pedido();
				pedido.setId(rs.getInt("Id"));
				pedido.setCliente(ClienteDAO.buscarPorIdPedido(pedido.getId()));//ver loop
				pedido.setEstado(rs.getString("Estado"));
				pedido.setFechaEntrega(new java.util.Date(rs.getDate("FechaEntrega").getTime()));
				java.sql.Timestamp fin=rs.getTimestamp("FechaFinalizado");
				if(fin==null){
					pedido.setFechaFinalizado(null);
				}else{
				pedido.setFechaFinalizado(new java.util.Date(fin.getTime()));
				}
				pedido.setProductosPedido(ProductoPedidoDAO.getProductos(pedido.getId()));
				pedidos.add(pedido);
			}
			return pedidos;
		}
		catch(SQLException sqex) {
			throw new PersistentException(sqex.getMessage());
		}
		finally {
			try {
				conn.close();
				if(pst != null) pst.close();
				if(rs != null) rs.close();
			}
			catch(SQLException sqex) {}
		}
	}
	
}

